Elasticsearch:跨集群搜索 Cross 您所在的位置:网站首页 elasticsearch 跨集群搜索 Elasticsearch:跨集群搜索 Cross

Elasticsearch:跨集群搜索 Cross

2023-10-23 23:29| 来源: 网络整理| 查看: 265

在我之前的文章 “跨集群搜索 Cross-cluster search (CCS)”,我已经详细描述了如何进行跨集群搜索。在那篇文章里,我的两个集群都是运行于本地的电脑,并且分布于不同的两个目录中。两个集群没有任何的安全设置。这个在实际的使用中是不现实的。前几天有个开发者在评论里问我:如果两个集群都设置有安全,那么该如何进行配置呢?怎么才能使得这两个集群之间进行跨集群搜索呢?在今天的文章中,我来详述如何实现这个。这里的配置也将适合跨集群复制(CCR)。

跨集群搜索启用跨多个集群的联合搜索。 将跨集群搜索与受保护集群一起使用时,所有集群都必须启用 Elasticsearch 安全功能。必须允许本地群集(用于启动跨群集搜索的群集)连接到远程群集,这意味着用于签署本地群集的 SSL/TLS 密钥的 CA 必须受到远程群集的信任。

用户身份验证是在本地群集上执行的,并且用户和用户的角色(role)将传递到远程群集。 远程集群会根据其本地角色定义检查用户的角色,以确定允许用户访问哪些索引。

警告:此功能是在 Elasticsearch v5.3 中作为 Beta 添加的,并在 5.4 和 5.5 中进行了进一步改进。 它要求符合网关要求的节点必须在 v5.5 或更高版本上。

要将跨集群搜索与安全集群一起使用:

在每个连接的集群中的每个节点上启用 Elasticsearch 安全功能。有关 xpack.security.enabled 设置的更多信息,请参阅 Elasticsearch 中的安全设置。全局启用加密。要加密通信,必须在每个节点上启用启用 SSL/TLS。在用于执行跨集群搜索的集群(本地集群)和所有远程集群之间启用信任关系。可以通过以下方式完成此操作: 使用相同的证书颁发机构为所有连接的群集生成证书,或者从本地群集中将 CA 证书添加为每个远程群集中的受信任 CA(请参阅传输 TLS 设置)。如果你是两个不同证书的集群,你可以在 elasticsearch.yml 中的 xpack.security.transport.ssl.certificate_authorities 添加对方的证书而得到受信。在本地群集上,确保将用户分配给(至少一个)远程群集上存在的一个角色。在远程群集上,使用该角色定义用户可以访问的索引。 (请参阅用户授权)。如配置远程群集中所述,配置本地群集以连接到远程群集。

在上面的描述中,是不是觉得很复杂啊?在接下来的文章中,我将详述如何进行练习。在今天的练习中,我将使用如下的配置:

如上所示,我把 Elasticsearch 安装于两个电脑上:Ubuntu OS 及 Mac OS。我们可以按照文章 “Security:如何安装 Elastic SIEM 和 EDR” 来对两个电脑启动安全配置。在安装的过程中,我们一定要注意的是使用同样的 CA 证书(尽管针对不同的集群,我们可以使用不同的证书)。在生成 Elasticsearch 及 Kibana 证书时,我们需要修改 instances.yml 文件:

instances: - name: "elasticsearch" ip: - "192.168.0.4" - "192.168.0.3" - name: "kibana" ip: - "192.168.0.4" - "192.168.0.3" ...

我们需要把两个电脑的 IP 地址都添加进去。这样,我们生产的 Elasticsearch 及 Kibana 证书将同时使用于两台电脑:

从上面,我们可以看出来两台电脑的安全配置已经完成。在我们的练习中,我将把 Mac OS 电脑视为本地集群,而把 Ubuntu 电脑视为远程集群。

在远程集群上进行配置

我们打开 Ubuntu 电脑的 Kibana。我们在 Dev Tools 中输入如下的一个命令:

PUT twitter/_doc/1 { "content": "This is so nice" }

它将生成一个叫做 twitter 的索引。我们接着为它创建一个叫做 twitter* 的索引模式:

接着我们来为这个索引创建一个叫做 twitter-role 的角色:

为了方便,我把 Privileges 设置为 all。你至少需要设置 read_cross_cluster 这个 Privileges。设置完毕后,我们其实可以通过如下的命令在 console 获得:

GET _security/role/twitter_role

上面的命令显示:

{ "twitter_role" : { "cluster" : [ ], "indices" : [ { "names" : [ "twitter*" ], "privileges" : [ "all" ], "field_security" : { "grant" : [ "*" ], "except" : [ ] }, "allow_restricted_indices" : false } ], "applications" : [ ], "run_as" : [ ], "metadata" : { }, "transient_metadata" : { "enabled" : true } } }

当然,我们也可以直接使用如下的命令来进行设置(如果你不喜欢使用 UI 来创建这个 twitter_role):

POST _security/role/twitter_role { "cluster": [], "indices": [ { "names": [ "twitter*" ], "privileges": [ "read", "read_cross_cluster" ] } ] }

在上面,我们设置我们只需要的 Privileges:read 及 read_cross_cluster。

到此为止,我们就对远程集群配置完毕。

在本地集群中进行配置

我们切换到 MacOS 中集群。打开本地集群的 Kibana。首先,我们需要为配置一个连接:

在上面 ubuntu:9300 指的是 ubuntu 电脑的 IP 地址的 9300 端口地址。你可以在电脑的 /etc/hosts 进行配置:

/etc/hosts

192.168.0.4 ubuntu

点击上面的 Save 按钮:

上面显示连接状态是成功的。当然你也可以直接使用如下的命令来实现:

PUT _cluster/settings { "persistent": { "cluster.remote.cluster_two.seeds": [ "192.168.0.4:9300" ] } }

请注意上面的 IP 地址 192.168.0.4 是 Ubuntu 电脑的 IP 地址。

接下来,我们可以创建一个叫做 twitter_role 的角色:

在上面,我们没有定义任何的 Privilieges。我们可以通过如下的命令来进行查看:

GET _security/role/twitter_role { "twitter_role" : { "cluster" : [ "manage_security" ], "indices" : [ ], "applications" : [ ], "run_as" : [ ], "metadata" : { }, "transient_metadata" : { "enabled" : true } } }

当然,我们甚至可以使用如下的命令来进行配置:

POST /_security/role/twitter_role { "cluster": [ "manage_security" ] }

这里的 manage_security 其实不是必须的。我设置它的目的是想在我接下来创建的用户 liuxg 中能进行一些关于 security 的管理。我们可以接下来创建一个叫做 liuxg 的用户,并把 twitter_role 赋予给它:

上面我们创建一个叫做 liuxg 的用户。我们实际上也可以使用如下的命令来创建这个用户:

POST /_security/user/liuxg { "password" : "password", "roles" : [ "twitter_role", "kibana_admin" ], "full_name" : "liuxg", "email" : "[email protected]", "enabled": true }

我们接着可以使用这个用户来登录 Kibana:

我们接下来打入如下的命令来对远程电脑中的 twitter 索引来进行搜索:

GET ubuntu:twitter/_search

请注意上面命令中的 ubuntu 是我们之前创建的 remote cluster 的连接的名称。从上面的结果中我们可以看到远程的索引 twitter 的搜索结果。

参考:

【1】 Cross-cluster search and security | Elasticsearch Guide [8.3] | Elastic



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有